// 菜单相关模型
package model

import util "gin-admin-api/utils"

// SysMenu 系统菜单结构体，用于表示系统中的菜单项。
// 它包含了菜单的基本信息，如名称、图标、URL、权限值等，并且支持树形结构（通过 ParentId 和 Children 字段）。
// 该结构体同时支持 GORM ORM 映射和 JSON 序列化/反序列化。
type SysMenu struct {
	// ID 是菜单项的唯一标识符，作为数据库表的主键。
	// GORM 标签说明：
	//   - column:id: 指定数据库列名为 "id"
	//   - comment:'主键': 在数据库中为该列添加注释 "主键"
	//   - primaryKey: 指定该列为表的主键
	//   - NOT NULL: 指定该列不允许为空
	// JSON 标签说明：
	//   - json:"id": 在序列化/反序列化 JSON 时，使用 "id" 作为字段名
	ID uint `gorm:"column:id;comment:'主键';primaryKey;NOT NULL" json:"id"` // ID

	// ParentId 表示当前菜单项的父菜单的 ID。
	// 如果 ParentId 为 0，则表示该菜单项是顶级菜单（根节点）。
	// GORM 标签说明：
	//   - column:parent_id: 指定数据库列名为 "parent_id"
	//   - comment:'父菜单id': 在数据库中为该列添加注释 "父菜单id"
	// JSON 标签说明：
	//   - json:"parentId": 在序列化/反序列化 JSON 时，使用 "parentId" 作为字段名
	ParentId uint `gorm:"column:parent_id;comment:'父菜单id'" json:"parentId"` // 父菜单id

	// MenuName 是菜单的显示名称。
	// GORM 标签说明：
	//   - column:menu_name: 指定数据库列名为 "menu_name"
	//   - varchar(100): 指定数据库列的数据类型为 VARCHAR，最大长度为 100
	//   - comment:'菜单名称': 在数据库中为该列添加注释 "菜单名称"
	// JSON 标签说明：
	//   - json:"menuName": 在序列化/反序列化 JSON 时，使用 "menuName" 作为字段名
	MenuName string `gorm:"column:menu_name;varchar(100);comment:'菜单名称'" json:"menuName"` // 菜单名称

	// Icon 是菜单项旁边显示的图标（通常使用图标字体库的类名，如 "fa fa-home"）。
	// GORM 标签说明：
	//   - column:icon: 指定数据库列名为 "icon"
	//   - varchar(100): 指定数据库列的数据类型为 VARCHAR，最大长度为 100
	//   - comment:'菜单图标': 在数据库中为该列添加注释 "菜单图标"
	// JSON 标签说明：
	//   - json:"icon": 在序列化/反序列化 JSON 时，使用 "icon" 作为字段名
	Icon string `gorm:"column:icon;varchar(100);comment:'菜单图标'" json:"icon"` // 菜单图标

	// Value 是与该菜单项关联的权限值或权限码。
	// 前端或后端可以根据这个值来判断用户是否有权限访问该菜单。
	// GORM 标签说明：
	//   - column:value: 指定数据库列名为 "value"
	//   - varchar(100): 指定数据库列的数据类型为 VARCHAR，最大长度为 100
	//   - comment:'权限值': 在数据库中为该列添加注释 "权限值"
	// JSON 标签说明：
	//   - json:"value": 在序列化/反序列化 JSON 时，使用 "value" 作为字段名
	Value string `gorm:"column:value;varchar(100);comment:'权限值'" json:"value"` // 权限值

	// MenuType 定义了菜单项的类型。
	// 枚举值：
	//   - 1: 目录（通常是一个可以展开的文件夹，不直接链接到页面）
	//   - 2: 菜单（链接到一个具体的页面或功能）
	//   - 3: 按钮（页面上的一个操作按钮，如“新增”、“删除”）
	// GORM 标签说明：
	//   - column:menu_type: 指定数据库列名为 "menu_type"
	//   - comment:'菜单类型：1->目录；2->菜单；3->按钮': 在数据库中为该列添加注释，说明各值的含义
	// JSON 标签说明：
	//   - json:"menuType": 在序列化/反序列化 JSON 时，使用 "menuType" 作为字段名
	MenuType uint `gorm:"column:menu_type;comment:'菜单类型：1->目录；2->菜单；3->按钮'" json:"menuType"` // 菜单类型：1->目录；2->菜单；3->按钮

	// Url 是菜单项对应的页面或接口的 URL 路径。
	// 当用户点击菜单时，通常会导航到这个 URL。
	// GORM 标签说明：
	//   - column:url: 指定数据库列名为 "url"
	//   - varchar(100): 指定数据库列的数据类型为 VARCHAR，最大长度为 100
	//   - comment:'菜单url': 在数据库中为该列添加注释 "菜单url"
	// JSON 标签说明：
	//   - json:"url": 在序列化/反序列化 JSON 时，使用 "url" 作为字段名
	Url string `gorm:"column:url;varchar(100);comment:'菜单url'" json:"url"` // 菜单url

	// MenuStatus 表示菜单项的启用状态。
	// 枚举值：
	//   - 1: 启用（菜单可见且可点击）
	//   - 2: 禁用（菜单通常会变灰或隐藏）
	// GORM 标签说明：
	//   - column:menu_status: 指定数据库列名为 "menu_status"
	//   - comment:'启用状态；1->启用；2->禁用': 在数据库中为该列添加注释，说明各值的含义
	// JSON 标签说明：
	//   - json:"menuStatus": 在序列化/反序列化 JSON 时，使用 "menuStatus" 作为字段名
	MenuStatus uint `gorm:"column:menu_status;comment:'启用状态；1->启用；2->禁用'" json:"menuStatus"` // 启用状态；1->启用；2->禁用

	// Sort 用于定义菜单项在同一层级内的显示顺序。
	// 数值越小，排序越靠前。
	// GORM 标签说明：
	//   - column:sort: 指定数据库列名为 "sort"
	//   - comment:'排序': 在数据库中为该列添加注释 "排序"
	// JSON 标签说明：
	//   - json:"sort": 在序列化/反序列化 JSON 时，使用 "sort" 作为字段名
	Sort uint `gorm:"column:sort;comment:'排序'" json:"sort"` // 排序

	// CreateTime 记录了菜单项创建的时间。
	// 使用了自定义的时间类型 util.HTime，该类型通常会处理 JSON 和数据库的序列化/反序列化格式。
	// GORM 标签说明：
	//   - column:create_time: 指定数据库列名为 "create_time"
	//   - comment:'创建时间': 在数据库中为该列添加注释 "创建时间"
	// JSON 标签说明：
	//   - json:"createTime": 在序列化/反序列化 JSON 时，使用 "createTime" 作为字段名
	CreateTime util.HTime `gorm:"column:create_time;comment:'创建时间'" json:"createTime"` // 创建时间

	// Children 是一个切片，用于存储当前菜单项的子菜单。
	// 这个字段在数据库中没有对应的列（由 gorm:"-" 表示），它是用来在内存中构建菜单树形结构的。
	// GORM 标签说明：
	//   - gorm:"-": 表示该字段不会映射到数据库表中，即数据库没有对应的列
	// JSON 标签说明：
	//   - json:"children": 在序列化/反序列化 JSON 时，使用 "children" 作为字段名，方便前端递归渲染树形菜单
	Children []SysMenu `json:"children" gorm:"-"` // 子集
}

func (SysMenu) TableName() string {
	return "sys_menu"
}

// AddSysMenuDto 添加菜单参数
type AddSysMenuDto struct {
	ParentId   uint   `json:"parentId"`   // 父菜单id
	MenuName   string `json:"menuName"`   // 菜单名称
	Icon       string `json:"icon"`       // 菜单图标
	Value      string `json:"value"`      // 权限值
	MenuType   uint   `json:"menuType"`   // 菜单类型：1->目录；2->菜单；3->按钮
	Url        string `json:"url"`        // 菜单url
	MenuStatus uint   `json:"menuStatus"` // 启用状态；1->启用；2->禁用
	Sort       uint   `json:"sort"`       // 排序
}

// UpdateSysMenuDto 修改菜单参数
type UpdateSysMenuDto struct {
	ID         uint   `json:"id"`
	ParentId   uint   `json:"parentId"`   // 父菜单id
	MenuName   string `json:"menuName"`   // 菜单名称
	Icon       string `json:"icon"`       // 菜单图标
	Value      string `json:"value"`      // 权限值
	MenuType   uint   `json:"menuType"`   // 菜单类型：1->目录；2->菜单；3->按钮
	Url        string `json:"url"`        // 菜单url
	MenuStatus uint   `json:"menuStatus"` // 启用状态；1->启用；2->禁用
	Sort       uint   `json:"sort"`       // 排序
}

// SysMenuIdDto 删除参数
type SysMenuIdDto struct {
	ID uint `json:"id"`
}
